﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using JasRibbonApplicatie.Classes;
using JasRibbonApplicatie.Model;

namespace JasRibbonApplicatie.Views
{
    /// <summary>
    /// Interaction logic for KiesJeAanvraag.xaml
    /// </summary>
    public partial class KiesJeAanvraag : Page
    {
        private List<Aanvraag> lijstAanvragen = new List<Aanvraag>();
        private Magazijnier huidigeMagazijnier;
        private List<Status> toegelatenStatussenAfhalen = new List<Status>();
        private List<Status> toegelatenStatussenInleveren = new List<Status>();
        private DateTime? vanTimeFrame = null;
        private DateTime? totTimeFrame = null;
        private DateTime? huidigeWeekMaandag = null;
        private bool? _inlevering;

        public bool? Inlevering
        {
            get
            {
                return _inlevering;
            }
            set
            {
                _inlevering = value;
                if (_inlevering == null)
                {
                    pijlImage.Visibility = Visibility.Visible;
                    aanvragenGrid.Visibility =Visibility.Collapsed;
                    infoLabel.Content = "Kies uit materiaal afhalen / inleveren";
                }
                else
                {
                    pijlImage.Visibility = Visibility.Collapsed;
                    aanvragenGrid.Visibility =Visibility.Visible;
                    if(_inlevering.Value)
                        infoLabel.Content = "Je koos inleveren. Kies een aanvraag.";
                    else
                        infoLabel.Content = "Je koos afhalen. Kies een aanvraag.";
                    if (vanTimeFrame == null)
                        calculateTimeFrame();
                    else
                        updateAanvragenLijst(vanTimeFrame.Value, totTimeFrame);
                }
            }
        }
        

        private static AanvraagModel am = new AanvraagModel();
        private MainWindow mainPageRef;

        public KiesJeAanvraag()
        {
            InitializeComponent();
            mainPageRef = Login.Instance.MainWindowReference;

            #region set huidige magazijnier & check bevoegheid
            var magazijnierRecordsGebruiker = Login.Instance.User.magazijniers.Where(m => m.einde == null || m.einde > DateTime.Now);
            if (magazijnierRecordsGebruiker.Count() > 0)
            {
                huidigeMagazijnier = magazijnierRecordsGebruiker.First();
            }
            else
            {
                huidigeMagazijnier = null;
                Console.WriteLine("geen magazijnier:");
                //geen magazijnier?
                //contolleer rechten.
                if (Login.Instance.User.rechten.omschrijving == "Beheerder")
                {
                    //bevoegd? Disable scannen tab, enable rest, move to aanvragen.

                    mainPageRef.materiaalTab.Visibility = Visibility.Visible;
                    mainPageRef.aanvragenTab.Visibility = Visibility.Visible;
                    mainPageRef.gebruikersTab.Visibility = Visibility.Visible;
                    mainPageRef.planningTab.Visibility = Visibility.Visible;
                    mainPageRef.materiaalTab.IsEnabled = true;
                    mainPageRef.aanvragenTab.IsEnabled = true;
                    mainPageRef.gebruikersTab.IsEnabled = true;
                    mainPageRef.planningTab.IsEnabled = true;

                    mainPageRef.aanvragenTab.IsSelected = true;

                    mainPageRef.scannenTab.Visibility = Visibility.Collapsed;
                    mainPageRef.scannenTab.IsEnabled = false;
                }
                else
                {
                    //niet bevoegd afmelden.
                    mainPageRef.Logoff_Click(null, null);
                }
            }
            #endregion

            #region set toegelaten statussen

            toegelatenStatussenAfhalen.Add(am.getStatus("definietieve goedkeuring"));
            toegelatenStatussenAfhalen.Add(am.getStatus("materiaal buiten"));

            toegelatenStatussenInleveren.Add(am.getStatus("materiaal buiten"));

            #endregion

            calculateTimeFrame();
            
            //initiele stand, geen keuze gemaakt
            mainPageRef.setVisualSelectionOntleningsButtons(null, this);
        }

        

        private void updateAanvragenLijst(DateTime van, DateTime? tot = null)
        {
            using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait))
            {
                if (Inlevering == null)
                {
                    mainPageRef.setVisualSelectionOntleningsButtons(null, this);
                }
                else if (!Inlevering.Value) //als afhaling
                {
                    if(tot==null){
                        lijstAanvragen = am.GetAanvragenByOphaalDate(van, toegelatenStatussenAfhalen);
                        if (van.Date == DateTime.Now.Date)
                            weekLabel.Content = "ontleningen vandaag af te halen.";
                        else
                            weekLabel.Content = "ontleningen af te halen op " + String.Format("{0:dddd dd/MM/yyyy}", van);
                        
                    } else {
                        lijstAanvragen = am.GetAanvragenByOphaalDate(van, tot.Value, toegelatenStatussenAfhalen);
                        weekLabel.Content = "ontleningen af te halen van " + String.Format("{0:dddd dd/MM/yyyy}", van) + " tot en met " + String.Format("{0:dddd dd/MM/yyyy}", tot.Value.AddDays(-1));
                    }
                }
                else
                {
                    if (tot == null){
                        lijstAanvragen = am.GetAanvragenByInleverDate(van, toegelatenStatussenInleveren);
                        if (van.Date == DateTime.Now.Date)
                            weekLabel.Content = "ontleningen vandaag in te leveren.";
                        else
                            weekLabel.Content = "ontleningen in te leveren op " + String.Format("{0:dddd dd/MM/yyyy}", van);
                        
                    } else {
                        lijstAanvragen = am.GetAanvragenByInleverDate(van, tot.Value, toegelatenStatussenInleveren);
                        weekLabel.Content = "ontleningen in te leveren van " + String.Format("{0:dddd dd/MM/yyyy}", van) + " tot en met " + String.Format("{0:dddd dd/MM/yyyy}", tot.Value.AddDays(-1));
                    }
                }
                aanvragenDataGrid.ItemsSource = lijstAanvragen;

                huidigeWeekButton.IsEnabled = (van != huidigeWeekMaandag || tot != huidigeWeekMaandag.Value.AddDays(7));
                
            }
        }


        private void vorigeWeekButton_Click(object sender, RoutedEventArgs e)
        {
            if (vanTimeFrame == null || totTimeFrame == null)
                calculateTimeFrame();
            vanTimeFrame = vanTimeFrame.Value.AddDays(-7);
            totTimeFrame = totTimeFrame.Value.AddDays(-7);
            updateAanvragenLijst(vanTimeFrame.Value,totTimeFrame);
        }
        private void volgendeWeekButton_Click(object sender, RoutedEventArgs e)
        {
            if (vanTimeFrame == null || totTimeFrame == null)
                calculateTimeFrame();
            vanTimeFrame = vanTimeFrame.Value.AddDays(+7);
            totTimeFrame = totTimeFrame.Value.AddDays(+7);
            updateAanvragenLijst(vanTimeFrame.Value, totTimeFrame);
        }

        private void huidigeWeekButton_Click(object sender, RoutedEventArgs e)
        {
            calculateTimeFrame();
            updateAanvragenLijst(vanTimeFrame.Value, totTimeFrame);
        }
        public void AanvragenVandaagButtonClick()
        {
            updateAanvragenLijst(DateTime.Now);
        }

        private void calculateTimeFrame()
        {
            DateTime van = DateTime.Now;
            DateTime tot = DateTime.Now;
            
            //=> neem dag van vandaag
            //=>bereken timespan ma 0:0:0 -> ma 0:0:0

            if (huidigeWeekMaandag == null)
            {
                van = van.AddHours(-van.Hour);
                van = van.AddMinutes(-van.Minute);
                van = van.AddSeconds(-van.Second);
                while (van.DayOfWeek != DayOfWeek.Monday) van = van.AddDays(-1);
                huidigeWeekMaandag = van;
            }
            else
            {
                van = huidigeWeekMaandag.Value;
            }
            
            tot = van.AddDays(7);
            
            vanTimeFrame = van;
            totTimeFrame = tot;
        }

        private void aanvragenDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            DataGrid dg = sender as DataGrid;
            nextButton.IsEnabled = (dg.SelectedItem != null);
        }

        private void nextButton_Click(object sender, RoutedEventArgs e)
        {
            if (aanvragenDataGrid.SelectedItem != null && huidigeMagazijnier != null && Inlevering != null)
            {
                mainPageRef.gotoScannen(aanvragenDataGrid.SelectedItem as Aanvraag);
            }
            else
            {
                nextButton.IsEnabled = false;
            }
        }



    }
}
